51. Embedding Managed Code (C# | VB)¶
Note
The below information is extensively based in information taken from the PowerShell® Notes for Professionals book. I plan to extend this information based on my day to day usage of the language.
- TypeDefinition
: Accepts the code as a string - Language
: Specifies the Managed Code language.Accepted values: CSharp, CSharpVersion3, CSharpVersion2, VisualBasic, JScript
This topic is to briefly describe how C# or VB .NET Managed code can be scripted and utilised within a PowerShell script. This topic is not exploring all facets of the Add-Type cmdlet. For more information on the Add-Type cmdlet, please refer to the MSDN documentation (for 5.1) here:
https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/add-type
51.1: C# Example¶
This example shows how to embed some basic C# into a PowerShell script, add it to the runspace/session and utilise the code within PowerShell syntax.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | $code = " using System; namespace MyNameSpace { public class Responder { public static void StaticRespond() { Console.WriteLine("Static Response"); } public void Respond() { Console.WriteLine("Instance Respond"); } } }" @ # Check the type has not been previously added within the session, otherwise an exception is raised if (-not ([System.Management.Automation.PSTypeName]'MyNameSpace.Responder').Type) { Add-Type -TypeDefinition $code -Language CSharp; } [ MyNameSpace.Responder]::StaticRespond(); $instance = New-Object MyNameSpace.Responder; $instance.Respond(); |
51.2: VB.NET Example¶
This example shows how to embed some basic C# into a PowerShell script, add it to the runspace/session and utilise the code within PowerShell syntax.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $code = @" Imports System Namespace MyNameSpace Public Class Responder Public Shared Sub StaticRespond() Console.WriteLine("Static Response") End Sub Public Sub Respond() Console.WriteLine("Instance Respond") End Sub End Class End Namespace "@ # Check the type has not been previously added within the session, otherwise an exception is raised if (-not ([System.Management.Automation.PSTypeName]'MyNameSpace.Responder').Type) { Add-Type -TypeDefinition $code -Language VisualBasic } [MyNameSpace.Responder]::StaticRespond() $instance = New-Object -TypeName MyNameSpace.Responder $instance.Respond() |